package com.wang.util;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import com.wang.packpojo.Param;
import com.wang.pojo.*;

import java.math.BigDecimal;
import java.util.*;

public class ModBusUtil {




    /*
     * 字节数组转16进制字符串
     */
    public static String bytes2HexString(byte[] b) {
        String r = "";
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            r += hex.toUpperCase() + " ";
        }
        return r;
    }


    public static String float2HexString(Float f){

        String value = Integer.toHexString(Float.floatToIntBits(f));
        return value;
    }


    /**
     * 16进制字符串转换成byte数组
     */
   /* public static byte[] HexString2Bytes(String hexString){
        byte[] arrB = hexString.getBytes();
        int iLen = arrB.length;
        byte[] arrOut = new byte[iLen / 2];
        String strTmp = null;
        for (int i = 0; i < iLen; i += 2)
        {
            strTmp = new String(arrB, i, 2);
            arrOut[(i / 2)] = ((byte)Integer.parseInt(strTmp, 16));
        }
        return arrOut;
    }*/
    public static byte[] HexString2Bytes(String hexStrings) {

        String hexString = hexStrings.replaceAll(" ", "");

        if (hexString == null || hexString.trim().equals("")) {
            return new byte[0];
        }

        byte[] bytes = new byte[hexString.length() / 2];
        for (int i = 0; i < hexString.length() / 2; i++) {
            String subStr = hexString.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }

        return bytes;

    }

    //重载
    public static byte[] HexStrings2Bytes(String[] hexStrings) {
        StringBuffer hexString1 = new StringBuffer();

        for (String ss : hexStrings) {
            hexString1.append(ss);
        }
        String hexString = hexString1.toString();

        if (hexString == null || hexString.trim().equals("")) {
            return new byte[0];
        }

        byte[] bytes = new byte[hexString.length() / 2];
        for (int i = 0; i < hexString.length() / 2; i++) {
            String subStr = hexString.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }

        return bytes;

    }

    // 16进制字符串转换10进制
    public static int hex2decimal(String hex) {
        return Integer.parseInt(hex, 16);
    }


    public static void main(String[] args) {
        String ss = "010300000008440c";
        String a = ss.substring(8,12);
        System.out.println(a);
        System.out.println(hex2decimal(a));
    }

    // 16进制字符串转换10进制
    public static Float hex2decimalFloat(String hex) {
        Long l = Long.parseLong(hex, 16);
        Float f = Float.intBitsToFloat(l.intValue());
        return f;
    }

    public static int hex2Short(String ss) {

        byte[] bytes = HexString2Bytes(ss);
        Short i = (short) (((bytes[0] & 0xff) << 8) | bytes[1] & 0xff);

        return i;

    }



    // 16进制字符串转换10进制
    public static Double hex2decimalDouble(String hex) {
        long longBits = Long.valueOf(hex, 16).longValue();
        return Double.longBitsToDouble(longBits);

    }

    // 使用1个字节表示
    public static String decToHex8(int b) {
        return String.format("%02x", b);// 2表示需要两个16进制数
    }

    // 使用2个字节表示
    public static String decToHex16(int b) {
        return String.format("%04x", b);
    }

    /**
     * 将10进制整型转为16进制字符串 （使用4个字节表示）
     *
     * @param b 10进制整型
     * @return 16进制字符串
     */
    public static String decToHex32(long b) {
        return String.format("%08x", b);
    }

    /**
     * 16进制表示的字符串转换为字节数组
     *
     * @param hexString 16进制表示的字符串
     * @return byte[] 字节数组
     */
    public static byte[] hexStringToByteArray(String hexString) {
        hexString = hexString.replaceAll(" ", "");
        int len = hexString.length();
        byte[] bytes = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            // 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个字节
            bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
                    .digit(hexString.charAt(i + 1), 16));
        }
        return bytes;
    }


    public static String[] convertBBLL(String byteType, String[] datas) {


        String[] newDatas = null;

        switch (byteType) {

            case "BL":

                newDatas = bl2bb(datas);
                break;
            case "LL":
                newDatas = ll2bb(datas);
                break;
            case "LB":
                newDatas = lb2bb(datas);
                break;
            case "BB":
                newDatas = datas;
                break;
            default:
                break;
        }
        return newDatas;
    }


    //字节序 小小转大大
    public static String[] ll2bb(String[] datas) {

        String[] newDatas = {datas[3], datas[2], datas[1], datas[0]};
        return newDatas;
    }

    //字节序 大小转大大
    public static String[] bl2bb(String[] datas) {

        String[] newDatas = {datas[2], datas[3], datas[0], datas[1]};
        return newDatas;
    }

    //字节序 小大转大大
    public static String[] lb2bb(String[] datas) {

        String[] newDatas = {datas[1], datas[0], datas[3], datas[2]};
        return newDatas;
    }





    public static String getCRC3(byte[] data) {
        byte[] crc16_h = {
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
                (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40
        };

        byte[] crc16_l = {
                (byte) 0x00, (byte) 0xC0, (byte) 0xC1, (byte) 0x01, (byte) 0xC3, (byte) 0x03, (byte) 0x02, (byte) 0xC2, (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05, (byte) 0xC5, (byte) 0xC4, (byte) 0x04,
                (byte) 0xCC, (byte) 0x0C, (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF, (byte) 0xCE, (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B, (byte) 0xC9, (byte) 0x09, (byte) 0x08, (byte) 0xC8,
                (byte) 0xD8, (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB, (byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF, (byte) 0x1F, (byte) 0xDD, (byte) 0x1D, (byte) 0x1C, (byte) 0xDC,
                (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7, (byte) 0x17, (byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12, (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1, (byte) 0xD0, (byte) 0x10,
                (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1, (byte) 0x33, (byte) 0xF3, (byte) 0xF2, (byte) 0x32, (byte) 0x36, (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35, (byte) 0x34, (byte) 0xF4,
                (byte) 0x3C, (byte) 0xFC, (byte) 0xFD, (byte) 0x3D, (byte) 0xFF, (byte) 0x3F, (byte) 0x3E, (byte) 0xFE, (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39, (byte) 0xF9, (byte) 0xF8, (byte) 0x38,
                (byte) 0x28, (byte) 0xE8, (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B, (byte) 0x2A, (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF, (byte) 0x2D, (byte) 0xED, (byte) 0xEC, (byte) 0x2C,
                (byte) 0xE4, (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7, (byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3, (byte) 0x23, (byte) 0xE1, (byte) 0x21, (byte) 0x20, (byte) 0xE0,
                (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63, (byte) 0xA3, (byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6, (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65, (byte) 0x64, (byte) 0xA4,
                (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D, (byte) 0xAF, (byte) 0x6F, (byte) 0x6E, (byte) 0xAE, (byte) 0xAA, (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9, (byte) 0xA8, (byte) 0x68,
                (byte) 0x78, (byte) 0xB8, (byte) 0xB9, (byte) 0x79, (byte) 0xBB, (byte) 0x7B, (byte) 0x7A, (byte) 0xBA, (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D, (byte) 0xBD, (byte) 0xBC, (byte) 0x7C,
                (byte) 0xB4, (byte) 0x74, (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7, (byte) 0xB6, (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73, (byte) 0xB1, (byte) 0x71, (byte) 0x70, (byte) 0xB0,
                (byte) 0x50, (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53, (byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57, (byte) 0x97, (byte) 0x55, (byte) 0x95, (byte) 0x94, (byte) 0x54,
                (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F, (byte) 0x9F, (byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A, (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59, (byte) 0x58, (byte) 0x98,
                (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89, (byte) 0x4B, (byte) 0x8B, (byte) 0x8A, (byte) 0x4A, (byte) 0x4E, (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D, (byte) 0x4C, (byte) 0x8C,
                (byte) 0x44, (byte) 0x84, (byte) 0x85, (byte) 0x45, (byte) 0x87, (byte) 0x47, (byte) 0x46, (byte) 0x86, (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41, (byte) 0x81, (byte) 0x80, (byte) 0x40
        };

        int crc = 0x0000ffff;
        int ucCRCHi = 0x00ff;
        int ucCRCLo = 0x00ff;
        int iIndex;
        for (int i = 0; i < data.length; ++i) {
            iIndex = (ucCRCLo ^ data[i]) & 0x00ff;
            ucCRCLo = ucCRCHi ^ crc16_h[iIndex];
            ucCRCHi = crc16_l[iIndex];
        }

        crc = ((ucCRCHi & 0x00ff) << 8) | (ucCRCLo & 0x00ff) & 0xffff;
        //高低位互换，输出符合相关工具对Modbus CRC16的运算
        crc = ((crc & 0xFF00) >> 8) | ((crc & 0x00FF) << 8);
        return String.format("%04X", crc);
    }


    //生成命令
    public static String makeUpCommand(DevMdtParamConf paramConf, List<DevMdtParamConfData> paramConfDataList) {


        //重新排序  按照开始字节大小排序
        List<DevMdtParamConfData> newParamConfDataList = search(paramConfDataList);

        //设置开始位置
        paramConf.setStartHexStr(newParamConfDataList.get(0).getStartHexStr());

        //设置命令  发送寄存器数目
        //拿到第一个 和最后一个
        DevMdtParamConfData firstParamConfData = newParamConfDataList.get(0);
        DevMdtParamConfData lastParamConfData = newParamConfDataList.get(newParamConfDataList.size() - 1);
        //计算发送命令的长度
        Integer firstnum = ModBusUtil.hex2decimal(firstParamConfData.getStartHexStr());
        Integer lastnum = ModBusUtil.hex2decimal(lastParamConfData.getStartHexStr());
        Integer count = lastnum - firstnum;
        if (lastParamConfData.getDataType().equals("FLOAT") || lastParamConfData.getDataType().equals("LONGINT")) {
            count = count + 2;
        } else {
            count = count + 1;
        }


        //组合命令
        String command = paramConf.getAddressCode();
        command += paramConf.getFunCode();
        command += paramConf.getStartHexStr();
        //添加长度
        String lenstr = ModBusUtil.decToHex16(count);
        command += lenstr;


        byte[] bytes = ModBusUtil.HexString2Bytes(command);

        String crc1 = ModBusUtil.getCRC3(bytes);
        command += crc1;
        //最终要发送的字符数组
        byte[] commandByte = ModBusUtil.HexString2Bytes(command);


        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < command.length(); i++) {
            sb.append(command.substring(i, i + 1));

            if (i > 0 && i < command.length() && ((i + 1) % 2) == 0) {
                sb.append(" ");
            }
        }



        return bytes2HexString(commandByte);
    }


    //解析数据命令
    //解析命令数据
    public static List<Param> readData(DevMdtParamConf paramConf, List<DevMdtParamConfData> paramConfDataList, byte[] bytes) {


        List<Param> paramList = new ArrayList<>();

        //重新排序  按照开始字节大小排序
        List<DevMdtParamConfData> newParamConfDataList = search(paramConfDataList);

        //设置开始位置
        paramConf.setStartHexStr(newParamConfDataList.get(0).getStartHexStr());

        //赋予开始地址 结束地址
        for (DevMdtParamConfData paramConfData : newParamConfDataList) {
            Integer start = (ModBusUtil.hex2decimal(paramConfData.getStartHexStr()) - ModBusUtil.hex2decimal(paramConf.getStartHexStr())) * 2;

            if (paramConfData.getDataType().equals("FLOAT") || paramConfData.getDataType().equals("LONG") || paramConfData.getDataType().equals("LONGINT")) {
                //float 占4个字节
                paramConfData.setStartSite(start);
                paramConfData.setEndSite(start + 3);
            } else if (paramConfData.getDataType().equals("INT") || paramConfData.getDataType().equals("SHORT")) {
                paramConfData.setStartSite(start);
                paramConfData.setEndSite(start + 1);
            }
        }


        //开始解析
        //先将bytes 转换成16进制字符串
        String baseData = ModBusUtil.bytes2HexString(bytes);


        String baseDataStr = baseData.replaceAll(" ", "");

        //转换成数组
        String[] baseDatas = baseData.split(" ");

        //要校验的数据
        String[] checkDatas = Arrays.copyOfRange(baseDatas, 0, baseDatas.length - 2);
        StringBuffer sb1 = new StringBuffer();
        for (String s : checkDatas) {
            sb1.append(s);
        }

        byte[] checkBytes = ModBusUtil.HexString2Bytes(sb1.toString());


        //计算crc值
        String checkCrc2 = ModBusUtil.getCRC3(checkBytes);
        //截取原有crc值
        String checkCrc1 = baseDataStr.substring(baseDataStr.length() - 4);

        if (checkCrc1.equals(checkCrc2)) {


            for (DevMdtParamConfData paramConfData : paramConfDataList) {

                Param param = null;


                String[] dataStr2 = Arrays.copyOfRange(baseDatas, paramConfData.getStartSite() + 3, paramConfData.getEndSite() + 4);


                //重新排序
                String[] lastDatas = ModBusUtil.convertBBLL(paramConfData.getByteType(), dataStr2);

                if(lastDatas ==null || lastDatas.length==0){
                    PrintUtil.print("打印错误数据："+dataStr2.toString());
                    System.out.println("-------------------");
                    System.out.println();
                    for(String ss : dataStr2){
                        System.out.print(ss);
                    }

                    System.out.println("-------------------");
                    PrintUtil.print("baseDatas:"+baseDatas);
                    System.out.println();
                    for(String ss : baseDatas){
                        System.out.print(ss);
                    }

                    System.out.println("-------------------");
                    PrintUtil.print("paramConfData.getStartSite():"+paramConfData.getStartSite());
                    PrintUtil.print("paramConfData.getEndSite():"+paramConfData.getEndSite());
                }


                StringBuffer data1 = new StringBuffer();
                for (String ss : lastDatas) {
                    data1.append(ss);
                }

                //开始解析数据
                if (paramConfData.getDataType().equals("FLOAT") || paramConfData.getDataType().equals("LONG") ) {

                    float floatData = ModBusUtil.hex2decimalFloat(data1.toString());



                    if (paramConfData.getNumMade()!=null && paramConfData.getNumMade() != 0) {
                        if(floatData!=0) {
                            Integer numMade = paramConfData.getNumMade();
                            Integer num = Math.abs(numMade);
                            floatData = numMade > 0 ? floatData / num : floatData * num;
                        }
                    }

                    //规则
                    if (paramConfData.getReserveNum() != 0) {
                        String str = "---";

                        if(!Float.isNaN(floatData)) {
                            BigDecimal bigDecimal = new BigDecimal(floatData);
                            str = bigDecimal.setScale(paramConfData.getReserveNum(), BigDecimal.ROUND_DOWN).toString();
                        }else {
                            PrintUtil.print("modbus传输无效值");
                        }

                        param = new Param(paramConfData.getParamName(), str);


                    } else {
                        String str = "---";

                        if(!Float.isNaN(floatData)) {
                            int hh = (int) floatData;
                            str = String.valueOf(hh);
                        }else {
                            PrintUtil.print("modbus传输无效值");
                        }


                        param = new Param(paramConfData.getParamName(), str);

                    }

                } else if (paramConfData.getDataType().equals("INT") || paramConfData.getDataType().equals("LONGINT") || paramConfData.getDataType().equals("SHORT")) {

                    if(paramConfData.getDataType().equals("LONGINT")){
                        PrintUtil.print("数据是longint");
                    }
                    Integer dd = 0;
                    if(paramConfData.getDataType().equals("INT") || paramConfData.getDataType().equals("LONGINT")){
                        dd = ModBusUtil.hex2decimal(data1.toString());
                    }else if(paramConfData.getDataType().equals("SHORT")){
                        dd = ModBusUtil.hex2Short(data1.toString());
                    }

                    Double doubleData = Double.valueOf(dd);

                    if (paramConfData.getNumMade() != 0) {

                        if(doubleData!=0) {

                            //杨锡洪定制数据处理
                            if(paramConfData.getNumMade().equals(1)){
                                doubleData = (doubleData - 30000) ;
                                if(paramConfData.getParamName().equals("余氯")) {
                                    doubleData =  5.0/16*(doubleData / 249 + 0.1 - 4);
                                }else if(paramConfData.getParamName().equals("pH")){
                                    doubleData = 6.0/16 * (doubleData / 249  - 4)+4;
                                }else if(paramConfData.getParamName().equals("浊度")){
                                    
                                    doubleData = 5.0/16 * (doubleData/249+0.1-4);

                                }
                            }else if(paramConfData.getNumMade().equals(2)) {
                                doubleData = (doubleData - 30000) ;
                                if(paramConfData.getParamName().equals("余氯")) {
                                    doubleData = (doubleData / 249  - 4)/16*10;
                                }else if(paramConfData.getParamName().equals("pH")){
                                    doubleData = (doubleData / 249  - 4)/16*10;
                                }else if(paramConfData.getParamName().equals("浊度")){

                                    doubleData = (doubleData / 249  - 4)/16*10;

                                }
                            }else {

                                Integer numMade = paramConfData.getNumMade();
                                Integer num = Math.abs(numMade);
                                doubleData = numMade > 0 ? doubleData / num : doubleData * num;
                            }
                        }
                    }

                    //规则
                    if (EmptyUtil.isNotNull(paramConfData.getReserveNum()) && paramConfData.getReserveNum() != 0) {

                        BigDecimal bigDecimal = new BigDecimal(doubleData);
                        String str = bigDecimal.setScale(paramConfData.getReserveNum(), BigDecimal.ROUND_DOWN).toString();


                        param = new Param(paramConfData.getParamName(), str);

                    } else {
                        int hh =  doubleData.intValue();

                        param = new Param(paramConfData.getParamName(), String.valueOf(hh));

                    }

                }

                //对cod进行例外处理
                //如果cod的值 >=32768  最终的值等于 减去65536
                if(param.getParamName().equals("ORP")){

                    try {
                        Double d = Double.parseDouble(param.getParamValue());
                        if(d!=null && d >= 32768){
                            Double  v = d - 32768;
                            param.setParamValue(v.toString());
                        }
                    } catch (NumberFormatException e) {

                    }
                }


                paramList.add(param);
            }


        } else {
            System.out.println("数据校验不通过 CRC 不通过" + checkCrc1 + ":" + checkCrc2);

        }
        return paramList;

    }


    // 方式4: 升序排列
    public static List<DevMdtParamConfData> search(List<DevMdtParamConfData> confDataList) {
        Collections.sort(confDataList, new Comparator<DevMdtParamConfData>() {
            @Override
            public int compare(DevMdtParamConfData o1, DevMdtParamConfData o2) {
                return o1.getStartHexStr().compareTo(o2.getStartHexStr());
            }
        });
        return confDataList;
    }

}
